package com.shujia

import scala.collection.mutable.ListBuffer
import scala.io.{BufferedSource, Source}

object Demo17List {
  def main(args: Array[String]): Unit = {

    /**
     * list
     * 1、有序
     * 2、不唯一
     * 3、通过下标查询快
     * 4、不可变的列表
     */
    //定义集合
    val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

    //1、通过下标获取元素
    println(list(2))
    //获取第一个元素
    println(list.head)
    //获取最后一个元素
    println(list.last)
    //取top
    println(list.take(3))
    //获取不包含第一个元素的所有元素
    println(list.tail)
    //求和
    println(list.sum)
    println(list.max) //最大值
    println(list.min) //最小值
    //反转列表
    println(list.reverse)
    //获取元素的数量
    println(list.length)

    //对列表中元素进行处理
    //1、使用循环实现
    for (i <- list) {
      println(i * 2)
    }

    /**
     * map 方法
     * 2、使用map函数实现
     * map方法原理：将list中的元素一个一个传递给后面的函数，函数的返回值再组成一个新的list
     *
     */
    val mapList: List[Int] = list.map((i: Int) => i + 1)
    println(mapList)


    //使用自己实现的map
    val result: List[Int] = map(list, (i: Int) => i * 200)
    println(result)


    /**
     * filter
     * 将列表中的元素一个一个传递给后面的函数，函数返回True保留数据，函数返回False过滤数据
     * filter最终会返回一个新的列表
     */

    //取出集合中的奇数
    //1、使用循环实现
    for (i <- list) {
      if (i % 2 == 1) {
        println(i)
      }
    }
    //2、使用filter实现
    val filterList: List[Int] = list.filter((i: Int) => i % 2 == 1)
    println(filterList)


    //读取学生表获取所有性别为男的学生
    val bufferedSource: BufferedSource = Source.fromFile("scala/data/students.csv")
    val students: List[String] = bufferedSource.getLines().toList

    val manStudent: List[String] = students.filter((stu: String) => {
      val sex: String = stu.split(",")(3)
      "男".equals(sex)
    })
    println(manStudent)

  }

  def map(list: List[Int], f: Int => Int): List[Int] = {

    //ListBuffer：可变列表相当于ArrayList
    val listBuffer = new ListBuffer[Int]

    for (i <- list) {
      //调用传进来的函数
      val j: Int = f(i)
      //将新的数据保存到新的列表中
      listBuffer += j
    }

    //返回一个新的列表
    listBuffer.toList
  }

}

